package object3;


/**
 * 代码块使用细节
 */
public class CodeBlockDetail04 {

    public static void main(String[] args) {

        /*
            创建一个子类对象时（继承关系），它们的静态代码块、静态属性初始化、普通代码块、普通属性初始化、构造方法的
            调用顺序如下：
            1)父类的静态代码块和静态属性
            2)子类的静态代码块和静态属性
            3)父类的普通代码块和普通属性初始化
            4)父类的构造方法
            5)子类的普通代码块和普通属性初始化
            6)子类的构造方法

            AAAAA extends BBBBB 类
         */

        new B02();
        /*
            1)先父类静态再子类静态
            getVal01
            A02的一个静态代码块..
            getVal03
            B02的一个静态代码块...

            2)父类普通 和 构造器
            A02的第一个普通代码块
            getVal02
            A02的构造器..

            3)子类普通 和 构造器
            getVal04
            B02的第一个普通代码块...
            B02的构造器
         */

        new C02();
        /*
            200
            m2()...
            100
            200
            m1()...
            m2()...
         */
    }
}

class A02 {

    private static int n1 = getVal01();

    static {
        System.out.println("A02的一个静态代码块..");
    }

    {
        System.out.println("A02的第一个普通代码块");
    }

    public int n3 = getVal02();

    public static int getVal01() {
        System.out.println("getVal01");
        return 10;
    }

    public static int getVal02() {
        System.out.println("getVal02");
        return 20;
    }

    public A02() {
        //super();
        //普通代码块和普通属性的初始化
        System.out.println("A02的构造器..");
    }
}

class C02 {

    private int n1 = 100;

    private static int n2 = 200;

    private void m1(){
        System.out.println("m1()...");
    }

    private static void m2(){
        System.out.println("m2()...");
    }

    static {
        //静态代码块
        //System.out.println(n1); //错误，无法访问非静态成员
        System.out.println(n2);
        m2();
    }

    {
        //普通代码块，可以使用任意成员
        System.out.println(n1);
        System.out.println(n2);//ok
        m1();
        m2();
    }
}

class B02 extends A02 {

    private static int n3 = getVal03();

    static {
        System.out.println("B02的一个静态代码块...");
    }

    public int n5 = getVal04();

    {
        System.out.println("B02的第一个普通代码块...");
    }

    public static int getVal03() {
        System.out.println("getVal03");
        return 30;
    }

    public static int getVal04() {
        System.out.println("getVal04");
        return 40;
    }

    public B02() {
        //super()
        //普通代码块和普通属性的初始化
        System.out.println("B02的构造器");
    }
}